
/*
* 可重入锁: 让锁记录一下是哪个线程给它锁住的,后续再加锁的时候,
* 如果加锁线程就是持有锁的线程就加锁成功
* */

/*


    synchronized(locker){
        synchronized (locker){

        }(2)
    }(1)

    上述代码中,synchronized是可重入锁,没有因为第二次加锁而产生死锁问题

    问: 当代码执行到2时,此时锁应不应该释放 不能释放,(2)后面的代码必须受到保护
    进一步的,如果代码有N层,释放时机该如何? 在最外层释放

    怎么判断是最外层的锁? 引用计数法 加一次锁该数值加一 释放一次锁 该数值减一

* */

public class Demo12 {
    Object locker = new Object();

    void Func1(){
        synchronized (locker){
            Func2();
        }
    }
    void Func2(){
        Func3();
    }

    void Func3(){
        Func4();
    }

    void Func4(){
        synchronized (locker){

        }
    }

}
